﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Parallel
{
	public class Parallel
	{

		public String type { get; set; } = "parallel";

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// string
		/// 该系列使用的坐标系，可选：
		/// 'parallel'
		///   使用平行坐标系，通过 parallelIndex 指定相应的平行坐标系组件。
		/// </summary>
		public String coordinateSystem { get; set; } = "parallel";

		/// <summary>
		/// number
		/// 使用的平行坐标系的 index，在单个图表实例中存在多个平行坐标系的时候有用。
		/// </summary>
		public int parallelIndex { get; set; } = 0;

		/// <summary>
		/// string
		/// 系列名称，用于tooltip的显示，legend 的图例筛选，在 setOption 更新数据和配置项时用于指定对应的系列。
		/// </summary>
		public String name { get; set; }

		/// <summary>
		/// Object
		/// 线条样式。
		/// </summary>
		public WUDI.ECharts.Series.Parallel.LineStyle.LineStyle lineStyle { get; set; }

		/// <summary>
		/// Object
		/// </summary>
		public WUDI.ECharts.Series.Parallel.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// number
		/// 框选时，未被选中的条线会设置成这个『透明度』（从而可以达到变暗的效果）。
		/// </summary>
		public double inactiveOpacity { get; set; } = 0.05;

		/// <summary>
		/// number
		/// 框选时，选中的条线会设置成这个『透明度』（从而可以达到高亮的效果）。
		/// </summary>
		public int activeOpacity { get; set; } = 1;

		/// <summary>
		/// boolean
		/// 是否实时刷新。
		/// </summary>
		public Boolean realtime { get; set; } = true;

		/// <summary>
		/// boolean,number
		/// 是否使用平滑曲线。默认为 false，可以设置为 true 或者一个范围为 0 到 1 的小数值，指定平滑程度。
		/// </summary>
		public dynamic smooth { get; set; } = false;

		/// <summary>
		/// number
		/// 渐进式渲染时每一帧绘制图形数量，设为 0 时不启用渐进式渲染，支持每个系列单独配置。
		/// 在图中有数千到几千万图形元素的时候，一下子把图形绘制出来，或者交互重绘的时候可能会造成界面的卡顿甚至假死。ECharts 4 开始全流程支持渐进渲染（progressive rendering），渲染的时候会把创建好的图形分到数帧中渲染，每一帧渲染只渲染指定数量的图形。
		/// 该配置项就是用于配置该系列每一帧渲染的图形数，可以根据图表图形复杂度的需要适当调整这个数字使得在不影响交互流畅性的前提下达到绘制速度的最大化。比如在 lines 图或者平行坐标中线宽大于 1 的 polyline 绘制会很慢，这个数字就可以设置小一点，而线宽小于等于 1 的 polyline 绘制非常快，该配置项就可以相对调得比较大。
		/// </summary>
		public int progressive { get; set; } = 500;

		/// <summary>
		/// number
		/// 启用渐进式渲染的图形数量阈值，在单个系列的图形数量超过该阈值时启用渐进式渲染。
		/// </summary>
		public int progressiveThreshold { get; set; } = 3000;

		/// <summary>
		/// string
		/// 分片的方式。可选值：
		/// 'sequential': 按照数据的顺序分片。缺点是渲染过程不自然。
		/// 'mod': 取模分片，即每个片段中的点会遍布于整个数据，从而能够视觉上均匀得渲染。
		/// </summary>
		public BarProgressiveChunkMode progressiveChunkMode { get; set; } = BarProgressiveChunkMode.sequential;

		/// <summary>
		/// Array
		/// 例如 series-parallel.data 中有如下数据：
		/// [
		///     [1,  55,  9,   56,  0.46,  18,  6,  '良'],
		///     [2,  25,  11,  21,  0.65,  34,  9,  '优'],
		///     [3,  56,  7,   63,  0.3,   14,  5,  '良'],
		///     [4,  33,  7,   29,  0.33,  16,  6,  '优'],
		///     { // 数据项也可以是 Object，从而里面能含有对线条的特殊设置。
		///         value: [5,  42,  24,  44,  0.76,  40,  16, '优']
		///         lineStyle: {...},
		///     }
		///     ...
		/// ]
		/// 数据中，每一行是一个『数据项』，每一列属于一个『维度』。（例如上面数据每一列的含义分别是：『日期』,『AQI指数』, 『PM2.5』, 『PM10』, 『一氧化碳值』, 『二氧化氮值』, 『二氧化硫值』）。
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// number
		/// 平行坐标所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 平行坐标组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// boolean
		/// 图形是否不响应和触发鼠标事件，默认为 false，即响应和触发鼠标事件。
		/// </summary>
		public Boolean silent { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "linear";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 300;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

	}
}
